/**
 * BitmapData 相关的一些控制
 * @author Kinglong
 * ibio 整理、修改
 * 2009-3-3 17:49
 */
package com.ibio8.media.image {
	import com.ibio8.utils.Base64;
	
	import flash.display.DisplayObject;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.geom.Rectangle;
	import flash.geom.Matrix;
	import flash.utils.ByteArray;
	/**
	 * BitmapData 相关的一些控制。
	 * 
	 * <p>
	 * 此类是对于 BitmapData 操作的集合类。
	 * </p>
	 * <b>此类最开始来自 Kinglong，由 ibio 整理、完善。</b>
	 */
	public class BitmapDataPlus {
		
		public function BitmapDataPlus(){
			throw new Error("BitmapDataPlus 实例化失败，因为它是一个静态类！");
		}
		
		/**
		 * 返回当前容器的快照
		 * @param	container	需要拍照的容器
		 * @param	x			x 位置
		 * @param	y			y 位置
		 * @param	w			宽度
		 * @param	h			高度
		 * @param	sx			x 缩放（0 - 1）
		 * @param	sy			y 缩放（0 - 1）
		 * @param	angle		偏转角度
		 * @return				位图数据
		 */
		public static function printContainer(container:DisplayObject, x:Number = 0, y:Number = 0, w:Number = 0, h:Number = 0, sx:Number = 1, sy:Number = 1, angle:Number = 0):BitmapData {
			if (w <= 0) {
				w = container.width;
			}
			if (h <= 0) {
				h = container.height;
			}
			var myMatrix:Matrix = new Matrix();
			//转换为弧度
			var radians:Number = (angle / 180) * Math.PI;
			myMatrix.createBox(sx, sy, radians, -x, -y);
			//
			var bmpd:BitmapData = new BitmapData(w, h, true, 0);
			bmpd.draw(container, myMatrix, null, null, new Rectangle(0, 0, w, h), true);
			return bmpd;
		}
		
		/**
		 * 将 BitmapData 进行 ByteArray 编码
		 * @param	data	需要编码的 BitmapData
		 * @return			已编码的 ByteArray
		 */
        public static function encodeBitmapData(data:BitmapData):ByteArray {
			var bytes:ByteArray = data.getPixels(data.rect);
            bytes.writeShort(data.width);
            bytes.writeShort(data.height);
            bytes.writeBoolean(data.transparent);
            bytes.compress();
            return bytes;
        }
		
		/**
		 * 将 BitmapData 数据进行 base64 编码
		 * @param	data	要编码的 BitmapData 数据
		 * @return			以编码的字符串
		 */
		public static function encodeBase64(data:BitmapData):String {
			return Base64.encodeByteArray(encodeBitmapData(data));
		}
		
		/**
		 * 将 ByteArray 进行 BitmapData	解码
		 * @param	bytes	需要编码的 ByteArray
		 * @return			实际的 BitmapData
		 */
		public static function decodeBitmapData(bytes:ByteArray):BitmapData {
            if (bytes == null) {
                throw new Error("bytes 参数不能为空!");
            }
            bytes.uncompress();
            if (bytes.length <  6) {
                throw new Error("bytes参数为无效值!");
            }
            bytes.position = bytes.length - 1;
            var transparent:Boolean = bytes.readBoolean();
            bytes.position = bytes.length - 3;
            var height:int = bytes.readShort();
            bytes.position = bytes.length - 5;
            var width:int = bytes.readShort();
            bytes.position = 0;
            var datas:ByteArray = new ByteArray();
            bytes.readBytes(datas, 0, bytes.length - 5);
            var bmpd:BitmapData = new BitmapData(width, height, transparent, 0);
            bmpd.setPixels(new Rectangle(0, 0, width, height), datas);
			return bmpd;
		}
		
		/**
		 * 将由 base64 编码的字符串解码成 BitmapData
		 * @param	data	字符串
		 * @return			最终的 BitmapData
		 */
		public static function decodeBase64(data:String):BitmapData {
			return decodeBitmapData(Base64.decodeToByteArray(data));
		}
	}
}

